package com.atguigu.mq.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 第一步：创建当前这个类
 * 第二步：给类上加 @Component 注解，放入 IOC 容器
 * 第三步：声明一个方法，方法名没有要求。方法参数设定如下：
 *      String content：用来接收消息内容的参数，可以没有。如果没有那么就调用 message.getBody() 获取
 *          消息内容的类型需要和消息本身的数据类型一致
 *      Message message：封装了消息内容和消息参数的对象。
 *          全类名：org.springframework.amqp.core.Message
 *      Channel channel：代表当前频道的对象
 * 第四步：需要通过注解的形式，来指定交换机、路由键、队列的相关参数
 *      总注解：@RabbitListener
 *      @RabbitListener bindings 属性：使用 @QueueBinding 注解赋值。
 *          如果这里指定的交换机、队列在 broker 上没有，则创建。
 *
 *      绑定关系：@QueueBinding
 *      @QueueBinding value 属性：指定队列名称，用 @Queue 注解赋值
 *          @Queue value 属性：队列名称
 *          @Queue durable 属性：队列是否持久化，注意它是字符串类型
 *          @Queue autoDelete 属性：队列是否自动删除，注意它是字符串类型
 *      @QueueBinding exchange 属性：指定交换机名称，用 @Exchange 注解赋值
 *          @Exchange value 属性：交换机名称
 *          @Exchange durable 属性：队列是否持久化，注意它是字符串类型
 *          @Exchange autoDelete 属性：队列是否自动删除，注意它是字符串类型
 *      @QueueBinding key 属性：指定路由键（设定交换机和队列的绑定关系），直接赋值一个字符串数组即可
 */
@Component
public class MyMessageListener {

    public static final String EXCHANGE_DIRECT = "exchange.direct.order";
    public static final String ROUTING_KEY = "order";
    public static final String QUEUE = "order.queue";

    @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = QUEUE, durable = "true", autoDelete = "false"),
        exchange = @Exchange(value = EXCHANGE_DIRECT, durable = "true", autoDelete = "false"),
        key = {ROUTING_KEY}
    ))
    public void processMessage(String content, Message message, Channel channel) {
        System.out.println("content = " + content);
    }

}
